//输入一个矩阵，按照从外向里以顺时针的顺序依次打印出每一个数字。 
//
// 
//
// 示例 1： 
//
// 输入：matrix = [[1,2,3],[4,5,6],[7,8,9]]
//输出：[1,2,3,6,9,8,7,4,5]
// 
//
// 示例 2： 
//
// 输入：matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
//输出：[1,2,3,4,8,12,11,10,9,5,6,7]
// 
//
// 
//
// 限制： 
//
// 
// 0 <= matrix.length <= 100 
// 0 <= matrix[i].length <= 100 
// 
//
// 注意：本题与主站 54 题相同：https://leetcode-cn.com/problems/spiral-matrix/ 
// Related Topics 数组 
// 👍 186 👎 0
#include <iostream>
#include <vector>

using namespace std;


//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0){
            return {};
        }

        int columns = matrix[0].size(),rows = matrix.size();
        int left = 0,right = columns-1,top = 0,bottom = rows - 1;
        vector<int> res(columns*rows);

        while (right >= left && bottom >= top){
            for (int column = left; column <= right; ++column) {
                res.push_back(matrix[top][column]);
            }
            for (int row = top + 1; row <= bottom; ++row) {
                res.push_back(matrix[row][right]);
            }
            if (left < right && top < bottom){
                for (int column = right - 1; column > left; column--) {
                    res.push_back(matrix[bottom][column]);
                }
                for (int row = bottom; row > top; row--) {
                    res.push_back(matrix[row][left]);
                }
            }
            left++;
            right--;
            top++;
            bottom--;
        }
        return res;
    }
};
//leetcode submit region end(Prohibit modification and deletion)
